import cv2
import pytesseract
from PIL import Image
import logging

# 配置日志记录
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

class OCR:
    def __init__(self, tesseract_path=None):
        """
        初始化 OCR 类。
        :param tesseract_path: Tesseract 的安装路径（可选，如果已添加到环境变量则无需指定）
        """
        logging.info("OCR 类初始化完成。")
        if tesseract_path:
            pytesseract.pytesseract.tesseract_cmd = tesseract_path
            logging.info(f"Tesseract 路径已设置为: {tesseract_path}")

    @staticmethod
    def ocr_from_image(image_path, lang='chi_sim', config=None):
        """
        从图像中提取文字。
        :param image_path: 图像文件路径
        :param lang: 语言代码（默认为中文 'chi_sim'，支持如 'eng' 等）
        :param config: Tesseract 的自定义配置（可选）
        :return: 识别的文本
        """
        logging.info(f"开始从图像 {image_path} 中提取文字，语言: {lang}")
        try:
            # 读取图像
            image = cv2.imread(image_path)
            if image is None:
                logging.error(f"无法加载图像文件: {image_path}")
                raise FileNotFoundError(f"无法加载图像文件: {image_path}")

            # 转换为灰度图
            gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
            logging.info("图像已转换为灰度图。")

            # 应用二值化
            _, binary_image = cv2.threshold(gray_image, 150, 255, cv2.THRESH_BINARY_INV)
            logging.info("图像二值化处理完成。")

            # 使用 Tesseract 进行文字识别
            text = pytesseract.image_to_string(binary_image, lang=lang, config=config)
            logging.info(f"文字识别完成，识别结果: {text.strip()}")

            return text.strip()  # 去除多余的空格和换行符
        except Exception as e:
            logging.error(f"OCR 处理失败: {str(e)}")
            raise Exception(f"OCR 处理失败: {str(e)}")